home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Magnum One
/
Magnum One (Mid-American Digital) (Disc Manufacturing).iso
/
d12
/
csrc1.arc
/
CRYPT.C
< prev
next >
Wrap
C/C++ Source or Header
|
1989-07-27
|
2KB
|
104 lines
/*
* duplicate crypt.s in a readable language
*/
/*)BUILD
*/
static int wheeldiv[] {
32,18,10,6,4
};
static int shift[] {
0000001,0000002,0000004,0000010,0000020,0000040,
0000100,0000200,0000400,0001000,0002000,0004000,
0010000,0020000,0040000,0100000,0000001,0000002
};
static char word[32];
char *
crypt(ukey)
char *ukey; /* pointer to user's string (max 63 chars) */
{
char *s, *k;
int *w, *d, *c, r, t;
char key[128];
int wheelcode[128],cagecode[128],cage[128],wheel[128];
/*
* copy the users key into new space and add junk if necessary
*/
k = key; s = ukey;
*k++ = 004; *k++ = 034;
while ((k < &key[64]) && (*k++ = *s++)) ;
--k; s = key;
while (k < &key[128]) *k++ = k[-1] ^ *s++;
/*
* establish wheel codes and cage codes
*/
w = wheelcode; c = cagecode; t = 256;
while (w < &wheelcode[128])
{ r = 0; *w = 0; d = wheeldiv;
*c = 0;
while (d < &wheeldiv[5])
{ r = (r + (t % *d++)) & ~040;
*w |= shift[r/2];
if (d < &wheeldiv[3])
*c |= shift[r/2+2];
}
w++; c++; t -= 2;
}
/*
* make the internal settings of the machine.
* both the lugs on the 128 cage bars and the lugs
* on the 16 wheels are set from the expanded key
*/
k = key; c = cage; w = wheel;
while (k < &key[128])
{ t = *k++ & 0177;
*c++ = cagecode[t];
*w++ = wheelcode[t];
}
/*
* now spin the cage against the wheel to produce output
*/
k = word; w = &wheel[64];
while (k < &word[8]) {
c = cage; r = 0; t = *--w;
while (c < &cage[128]) {
if ((*c++ & t))
r++;
}
/*
* we now have a piece of output from current wheel
* it needs to be folded to remove lingering hopes of
* inverting the function
*/
r = r % 62 + '0';
if (r > '9') {
r += ('A'-'9'-1);
if (r > 'Z')
r += ('a'-'Z'-1);
}
*k++ = r;
}
return(word);
}
main() /* special purpose routine: test on one password */
{
register char c, *s;
char str[20];
for (;;)
{ printf("password: ");
for (s=str; (c=getchar()) != '\n';) *s++ = c;
*s = 0;
printf("crypt(%s)=%s\n",str,crypt(str));
}
}